package algorithm.middle;

import java.util.ArrayList;
import java.util.Comparator;

/**
 * 给定2D空间中四个点的坐标 p1, p2, p3 和 p4，如果这四个点构成一个正方形，则返回 true 。
 * <p>
 * 点的坐标 pi 表示为 [xi, yi] 。输入 不是 按任何顺序给出的。
 * <p>
 * 一个 有效的正方形 有四条等边和四个等角(90度角)。
 * <p>
 *  
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/valid-square
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class ValidSquare593 {

    public boolean validSquare(int[] p1, int[] p2, int[] p3, int[] p4) {
        ArrayList<int[]> list = new ArrayList<>();
        list.add(p1);
        list.add(p2);
        list.add(p3);
        list.add(p4);
        //排序后。下标0和3分别是两个顶点
        list.sort((o1, o2) -> {
            if (o1[0] == o2[0]) return o1[1] - o2[1];
            return o1[0] - o2[0];
        });
        //只需要计算4个边长及角度
        long l1 = countLine(list.get(0), list.get(1));
        long l2 = countLine(list.get(0), list.get(2));
        long l3 = countLine(list.get(3), list.get(1));
        long l4 = countLine(list.get(3), list.get(2));
        if (l1==l2 && l3==l4 && l1==l3){
            if (l1==0) return false;
            //判断任意夹角
            int[] dot0 = list.get(0);
            int[] dot1 = list.get(1);
            int[] dot2 = list.get(2);
            //向量点乘为0
            int num = (dot1[0] - dot0[0]) * (dot2[0] - dot0[0]) + (dot2[1] - dot0[1]) * (dot1[1] - dot0[1]);
            if (num==0){
                return true;
            }
        }
        return false;

    }

    //计算边长
    public long countLine(int[] a,int[] b){
        //勾股定理
        return Math.abs(a[0] - b[0]) * Math.abs(a[0] - b[0]) + Math.abs(a[1] - b[1]) * Math.abs(a[1] - b[1]);
    }

    public static void main(String[] args) {
        new ValidSquare593().validSquare(new int[]{0, 0}, new int[]{0, 0}, new int[]{0, 0}, new int[]{0, 0});
    }
}
